<?php
/**
 * Copyright (c) 2009, Microsoft
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Microsoft nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Microsoft ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Microsoft BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Microsoft
 * @package    WebErrorPHPToolkit
 * @subpackage WebConfigCache
 * @version    $Id: WebConfigCache.php, v 1.0 2009-10-09 08:00:00Z unknown $
 * @copyright  Copyright (c) 2009, Microsoft (http://www.microsoft.com)
 * @author     jeff00seattle
 *
 * Reads and enters values from web.config.cache file
 */

require_once 'library/WebConfigXml.php';

/**
 * Encode data into JSON as the contents for cache.
 *
 * @param data string
 * @param cacheFile string
 * @return void
 */
function web_error_writeCache($data, $cacheFile='default_cache.json')
{
  try
  {
    if(!$fp=fopen($cacheFile,'w'))
    {
      throw new WebToolkit_WebConfigCache_Exception('Error opening cache file.');
    }

    if(!flock($fp,LOCK_EX))
    {
      throw new WebToolkit_WebConfigCache_Exception('Unable to lock file.');
    }

    if(!fwrite($fp, json_encode($data)))
    {
      throw new WebToolkit_WebConfigCache_Exception('Error writing to cache file.');
    }

    flock($fp,LOCK_UN);
    fclose($fp);
  }
  catch (WebToolkit_WebConfigCache_Exception $ex)
  {
    throw($ex);
  }
  catch (Exception $ex)
  {
    throw new WebToolkit_WebConfigCache_Exception('Unexpected Exception: ' . $ex->getMessage());
  }

  return true;
}


/**
 * Get cache contents, which is a JSON string, and decode it into an array.
 *
 * @param string $cacheFile
 * @return array, decoded from JSON string
 */
function web_error_readCache($cacheFile)
{
    if(!file_exists($cacheFile))
    {
      throw new WebToolkit_WebConfigCache_Exception('Invalid cache file: "' . $cacheFile . '".');
    }

    return json_decode(file_get_contents($cacheFile));
}

/**
 * Read from cache or update from web.config.xml.
 *
 * @return boolean, True upon success.
 */
function web_error_web_config_cache()
{
  try
  {
    // define cache file
    $cacheFile='cache/web.config.json';
    // define expire time in seconds (2 hours)
    $expireTime=7200;
    // check to see if cache file is valid (time triggered caching)
    if(file_exists($cacheFile) && filemtime($cacheFile)>(time()- $expireTime))
    {
        // read data from cache file
        $data=web_error_readCache($cacheFile);
        set_site_variables($data);
    }
    else
    {
      if (!web_error_load_web_config())
      {
        throw new WebToolkit_WebConfigCache_Exception('Failed to load Web configuration.');
      }
      
      if (!web_error_bing_search_assets())
      {
        throw new WebToolkit_WebConfigCache_Exception('Failed to load Bing search assets.');
      }

      $data = get_site_variables();
      if (!web_error_writeCache($data, $cacheFile))
      {
        throw new WebToolkit_WebConfigCache_Exception('Failed to write web config data to cache.');
      }
    }
  }
  catch (WebToolkit_WebConfigCache_Exception $ex)
  {
    throw($ex);
  }
  catch (Exception $ex)
  {
    throw new WebToolkit_WebConfigCache_Exception( $ex->getMessage() );
    return false;
  }

  return true;
}

?>